home *** CD-ROM | disk | FTP | other *** search
- /*
- ** termFastMacroWindow.c
- **
- ** Fast! macro window support routines
- **
- ** Copyright © 1990-1995 by Olaf `Olsen' Barthel
- ** All Rights Reserved
- */
-
- #include "termGlobal.h"
-
- /* Window border scroller. */
-
- enum { GAD_SCROLLER = 10000,GAD_UP,GAD_DOWN };
-
- /* The arrow image height. */
-
- #define ARROW_HEIGHT 11
-
- /* Pack two words into a long. */
-
- #define PACK_ULONG(a,b) (((ULONG)(a)) << 16 | b)
-
- /* Gadget extension. */
-
- struct ButtonInfo
- {
- struct Image *ButtonImage;
- STRPTR ButtonCommand;
- LONG NumChars;
- };
-
- /* A private button gadget attribute. */
-
- #define BGA_Command (TAG_USER + 1)
-
- /* Private button gadget class. */
-
- STATIC struct IClass *ButtonClass;
-
- /* Window border scroller. */
-
- STATIC struct Gadget *Scroller,
- *UpArrow,
- *DownArrow;
-
- /* Width of the window border scroller. */
-
- STATIC UWORD RightBorderWidth;
-
- /* Scroller arrow imagery. */
-
- STATIC struct Image *UpImage,
- *DownImage;
-
- /* The window zoom box. */
-
- STATIC struct IBox WindowZoomBox = { -1,-1,-1,-1 };
-
- /* The fast macro buttons. */
-
- STATIC struct Gadget *Buttons;
-
- /* The first visible button and the number buttons
- * visible in total.
- */
-
- STATIC LONG ButtonTop,
- ButtonCount;
-
- /* RenderText():
- *
- * Render the button text.
- */
-
- STATIC VOID __regargs
- RenderText(struct RastPort *RPort,struct GadgetInfo *GadgetInfo,struct Gadget *Gadget,LONG Len)
- {
- UWORD Width = (GadgetInfo -> gi_Window -> Width - (GadgetInfo -> gi_Window -> BorderLeft + GadgetInfo -> gi_Window -> BorderRight + 4));
- STRPTR Label = (STRPTR)Gadget -> GadgetText;
- ULONG State;
- UWORD Pen;
-
- /* Which state is the button in? */
-
- if(Gadget -> Flags & GFLG_SELECTED)
- {
- State = IDS_SELECTED;
- Pen = GadgetInfo -> gi_DrInfo -> dri_Pens[FILLTEXTPEN];
- }
- else
- {
- State = IDS_NORMAL;
- Pen = GadgetInfo -> gi_DrInfo -> dri_Pens[TEXTPEN];
- }
-
- /* Render the frame. */
-
- DoMethod(Gadget -> GadgetRender,IM_DRAWFRAME,RPort,PACK_ULONG(Gadget -> LeftEdge + 2,Gadget -> TopEdge),State,GadgetInfo -> gi_DrInfo,PACK_ULONG(Width,Gadget -> Height));
-
- /* Set the rendering pens. */
-
- if(Kick30)
- SetABPenDrMd(RPort,Pen,0,JAM1);
- else
- {
- SetDrMd(RPort,JAM1);
- SetAPen(RPort,Pen);
- }
-
- /* Render the button label. */
-
- Move(RPort,Gadget -> LeftEdge + 4,Gadget -> TopEdge + (Gadget -> Height - GadgetInfo -> gi_DrInfo -> dri_Font -> tf_YSize) / 2 + GadgetInfo -> gi_DrInfo -> dri_Font -> tf_Baseline);
- Text(RPort,Label,Len);
- }
-
- /* SetButton():
- *
- * Set an aspect of the button.
- */
-
- STATIC ULONG __regargs
- SetButton(struct IClass *class,Object *object,struct opSet *SetInfo)
- {
- struct ButtonInfo *ButtonInfo = INST_DATA(class,object);
- struct TagItem *Tag,*TagList = SetInfo -> ops_AttrList;
- struct RastPort *RPort;
- STRPTR Label;
- BOOLEAN Finished = FALSE;
-
- /* Scan the attribute list. */
-
- while(Tag = NextTagItem(&TagList))
- {
- switch(Tag -> ti_Tag)
- {
- // New command string?
-
- case BGA_Command:
-
- ButtonInfo -> ButtonCommand = (STRPTR)Tag -> ti_Data;
- break;
-
- // New label text?
-
- case GA_Text:
-
- Label = (STRPTR)Tag -> ti_Data;
-
- ((struct Gadget *)object) -> GadgetText = (struct IntuiText *)Label;
-
- if(RPort = ObtainGIRPort(SetInfo -> ops_GInfo))
- {
- struct TextExtent Extent;
-
- ButtonInfo -> NumChars = TextFit(RPort,Label,strlen(Label),&Extent,NULL,1,((struct Gadget *)object) -> Width - 8,32767);
-
- RenderText(RPort,SetInfo -> ops_GInfo,(struct Gadget *)object,ButtonInfo -> NumChars);
-
- ReleaseGIRPort(RPort);
- }
-
- Finished = TRUE;
-
- break;
- }
- }
-
- if(Finished)
- return(TRUE);
- else
- return(DoSuperMethodA(class,object,(Msg)SetInfo));
- }
-
- /* RenderButton():
- *
- * Render the button label.
- */
-
- STATIC ULONG __regargs
- RenderButton(struct IClass *class,Object *object,struct gpRender *RenderInfo)
- {
- struct ButtonInfo *ButtonInfo = INST_DATA(class,object);
-
- /* No label length calculated yet? */
-
- if(!ButtonInfo -> NumChars)
- {
- STRPTR Label = (STRPTR)((struct Gadget *)object) -> GadgetText;
- struct TextExtent Extent;
-
- ButtonInfo -> NumChars = TextFit(RenderInfo -> gpr_RPort,Label,strlen(Label),&Extent,NULL,1,((struct Gadget *)object) -> Width - 8,32767);
- }
-
- RenderText(RenderInfo -> gpr_RPort,RenderInfo -> gpr_GInfo,(struct Gadget *)object,ButtonInfo -> NumChars);
-
- return(TRUE);
- }
-
- /* FreeButton():
- *
- * Free a button gadget object.
- */
-
- STATIC ULONG __regargs
- FreeButton(struct IClass *class,Object *object,Msg msg)
- {
- struct ButtonInfo *ButtonInfo = INST_DATA(class,object);
-
- if(ButtonInfo -> ButtonImage)
- DisposeObject(ButtonInfo -> ButtonImage);
-
- return(DoSuperMethodA(class,object,msg));
- }
-
- /* NewButton():
- *
- * Create a new button object.
- */
-
- STATIC ULONG __regargs
- NewButton(struct IClass *class,Object *object,struct opSet *SetMethod)
- {
- LONG Width,
- Height;
- struct TagItem *Tag;
- struct Gadget *NewGadget = NULL;
-
- /* Determine object width. */
-
- if(Tag = FindTagItem(GA_Width,SetMethod -> ops_AttrList))
- Width = Tag -> ti_Data;
- else
- Width = 0;
-
- /* Determine object height. */
-
- if(Tag = FindTagItem(GA_Height,SetMethod -> ops_AttrList))
- Height = Tag -> ti_Data;
- else
- Height = 0;
-
- /* Proper dimensions? */
-
- if(Width && Height)
- {
- struct Image *ButtonImage;
-
- /* Create a button frame. */
-
- if(ButtonImage = NewObject(NULL,"frameiclass",
- IA_Width, Width,
- IA_Height, Height,
- TAG_DONE))
- {
- struct TagItem *OldTags = SetMethod -> ops_AttrList,
- NewTags[2];
-
- /* Add new tag values. */
-
- NewTags[0] . ti_Tag = GA_Image;
- NewTags[0] . ti_Data = (ULONG)ButtonImage;
- NewTags[1] . ti_Tag = TAG_MORE;
- NewTags[1] . ti_Data = (ULONG)OldTags;
-
- SetMethod -> ops_AttrList = NewTags;
-
- /* Create new object. */
-
- if(NewGadget = (struct Gadget *)DoSuperMethodA(class,object,(Msg)SetMethod))
- {
- struct ButtonInfo *ButtonInfo = INST_DATA(class,NewGadget);
-
- /* Clear the number of characters displayed,
- * the first rendering call will adjust it.
- */
-
- ButtonInfo -> NumChars = 0;
-
- /* Install the corresponding command. */
-
- if(Tag = FindTagItem(BGA_Command,OldTags))
- ButtonInfo -> ButtonCommand = (STRPTR)Tag -> ti_Data;
-
- /* Remember the frame image. */
-
- ButtonInfo -> ButtonImage = ButtonImage;
-
- /* Restore the tags. */
-
- SetMethod -> ops_AttrList = OldTags;
- }
- else
- {
- DisposeObject(ButtonImage);
-
- CoerceMethod(class,(Object *)NewGadget,OM_DISPOSE);
-
- return(0);
- }
- }
- }
-
- return((ULONG)NewGadget);
- }
-
- /* HandleButton():
- *
- * Handle button input.
- */
-
- STATIC ULONG __regargs
- HandleButton(struct IClass *class,Object *object,struct gpInput *InputInfo)
- {
- ULONG Result = GMR_MEACTIVE;
- BOOLEAN Redraw = FALSE,
- Final = FALSE;
- struct ButtonInfo *ButtonInfo = INST_DATA(class,object);
- struct Gadget *Button = (struct Gadget *)object;
-
- /* Only mouse events trigger actions. */
-
- if(InputInfo -> gpi_IEvent -> ie_Class == IECLASS_RAWMOUSE)
- {
- /* Selection cancelled or no command available? */
-
- if(InputInfo -> gpi_IEvent -> ie_Code == MENUDOWN || !ButtonInfo -> ButtonCommand[0])
- {
- if(Button -> Flags & GFLG_SELECTED)
- {
- Button -> Flags &= ~GFLG_SELECTED;
-
- Redraw = TRUE;
- }
-
- Result = GMR_NOREUSE;
-
- /* No further actions, please. */
-
- Final = TRUE;
- }
- else
- {
- /* Select button released? */
-
- if(InputInfo -> gpi_IEvent -> ie_Code == SELECTUP)
- {
- if(Button -> Flags & GFLG_SELECTED)
- {
- *InputInfo -> gpi_Termination = 0;
-
- Button -> Flags &= ~GFLG_SELECTED;
-
- Redraw = TRUE;
- }
- else
- *InputInfo -> gpi_Termination = 1;
-
- Result = GMR_REUSE | GMR_VERIFY;
-
- /* No further actions, please. */
-
- Final = TRUE;
- }
- }
- }
-
- /* Change highlighting mode? */
-
- if(!Final)
- {
- /* Hit inside the boundaries? */
-
- if(DoMethod((Object *)ButtonInfo -> ButtonImage,IM_HITFRAME,PACK_ULONG(InputInfo -> gpi_Mouse . X,InputInfo -> gpi_Mouse . Y),PACK_ULONG(Button -> Width,Button -> Height)))
- {
- if(!(Button -> Flags & GFLG_SELECTED))
- {
- Button -> Flags |= GFLG_SELECTED;
-
- Redraw = TRUE;
- }
- }
- else
- {
- if(Button -> Flags & GFLG_SELECTED)
- {
- Button -> Flags &= ~GFLG_SELECTED;
-
- Redraw = TRUE;
- }
- }
- }
-
- /* Redraw the object? */
-
- if(Redraw)
- {
- struct RastPort *RPort;
-
- if(RPort = ObtainGIRPort(InputInfo -> gpi_GInfo))
- {
- RenderText(RPort,InputInfo -> gpi_GInfo,Button,ButtonInfo -> NumChars);
-
- ReleaseGIRPort(RPort);
- }
- }
-
- return(Result);
- }
-
- /* ButtonDispatch():
- *
- * The button gadget class dispatcher.
- */
-
- STATIC ULONG __saveds __asm
- ButtonDispatch(register __a0 struct IClass *class,register __a2 Object *object,register __a1 Msg msg)
- {
- /* Select the message method. */
-
- switch(msg -> MethodID)
- {
- case OM_NEW:
-
- return(NewButton(class,object,(struct opSet *)msg));
-
- case OM_UPDATE:
- case OM_SET:
-
- return(SetButton(class,object,(struct opSet *)msg));
-
- case OM_DISPOSE:
-
- return(FreeButton(class,object,msg));
-
- case GM_RENDER:
-
- return(RenderButton(class,object,(struct gpRender *)msg));
-
- case GM_HITTEST:
-
- return(GMR_GADGETHIT);
-
- case GM_GOINACTIVE:
-
- return(0);
-
- case GM_GOACTIVE:
-
- return(GMR_MEACTIVE);
-
- case GM_HANDLEINPUT:
-
- return(HandleButton(class,object,(struct gpInput *)msg));
-
- default:
-
- return(DoSuperMethodA(class,object,msg));
- }
- }
-
- /* FreeButtonClass(VOID):
- *
- * Free private button gadget class.
- */
-
- STATIC VOID
- FreeButtonClass(VOID)
- {
- if(ButtonClass)
- {
- FreeClass(ButtonClass);
-
- ButtonClass = NULL;
- }
- }
-
- /* NewButtonClass(VOID):
- *
- * Create private button gadget class.
- */
-
- STATIC BYTE
- NewButtonClass(VOID)
- {
- if(ButtonClass = MakeClass(NULL,GADGETCLASS,NULL,sizeof(struct ButtonInfo),0))
- {
- ButtonClass -> cl_Dispatcher . h_Entry = (HOOKFUNC)ButtonDispatch;
-
- return(TRUE);
- }
- else
- return(FALSE);
- }
-
- /* FastDeleteScroller(VOID):
- *
- * Delete fast! macro window scroller.
- */
-
- STATIC VOID
- FastDeleteScroller(VOID)
- {
- if(Scroller)
- {
- DisposeObject(Scroller);
-
- Scroller = NULL;
- }
-
- if(UpArrow)
- {
- DisposeObject(UpArrow);
-
- UpArrow = NULL;
- }
-
- if(DownArrow)
- {
- DisposeObject(DownArrow);
-
- DownArrow = NULL;
- }
-
- if(UpImage)
- {
- DisposeObject(UpImage);
-
- UpImage = NULL;
- }
-
- if(DownImage)
- {
- DisposeObject(DownImage);
-
- DownImage = NULL;
- }
- }
-
- /* FastCreateScroller(struct Screen *Screen):
- *
- * Create fast! macro window scroller.
- */
-
- STATIC BYTE __regargs
- FastCreateScroller(struct Screen *Screen)
- {
- struct DrawInfo *DrawInfo;
- BYTE Result = FALSE;
-
- if(DrawInfo = GetScreenDrawInfo(Screen))
- {
- struct Image *SizeImage;
- ULONG SizeWidth,
- SizeHeight,
- ArrowHeight;
- UWORD SizeType;
-
- if(Screen -> Flags & SCREENHIRES)
- SizeType = SYSISIZE_MEDRES;
- else
- SizeType = SYSISIZE_LOWRES;
-
- if(SizeImage = (struct Image *)NewObject(NULL,"sysiclass",
- SYSIA_Size, SizeType,
- SYSIA_Which, SIZEIMAGE,
- SYSIA_DrawInfo, DrawInfo,
- TAG_DONE))
- {
- GetAttr(IA_Width, SizeImage,&SizeWidth);
- GetAttr(IA_Height, SizeImage,&SizeHeight);
-
- DisposeObject(SizeImage);
-
- RightBorderWidth = SizeWidth;
-
- if(UpImage = (struct Image *)NewObject(NULL,"sysiclass",
- SYSIA_Size, SizeType,
- SYSIA_Which, UPIMAGE,
- SYSIA_DrawInfo, DrawInfo,
- TAG_DONE))
- {
- GetAttr(IA_Height,UpImage,&ArrowHeight);
-
- if(DownImage = (struct Image *)NewObject(NULL,"sysiclass",
- SYSIA_Size, SizeType,
- SYSIA_Which, DOWNIMAGE,
- SYSIA_DrawInfo, DrawInfo,
- TAG_DONE))
- {
- if(Scroller = NewObject(NULL,"propgclass",
- GA_ID, GAD_SCROLLER,
-
- GA_Top, Screen -> WBorTop + Screen -> Font -> ta_YSize + 2,
- GA_RelHeight, -(Screen -> WBorTop + Screen -> Font -> ta_YSize + 2 + SizeHeight + 1 + 2 * ArrowHeight),
- GA_Width, SizeWidth - 8,
- GA_RelRight, -(SizeWidth - 5),
-
- GA_Immediate, TRUE,
- GA_FollowMouse, TRUE,
- GA_RelVerify, TRUE,
- GA_RightBorder, TRUE,
-
- PGA_Freedom, FREEVERT,
- PGA_NewLook, TRUE,
- PGA_Borderless, TRUE,
-
- PGA_Visible, 1,
- PGA_Total, 1,
- TAG_DONE))
- {
- STATIC struct TagItem ArrowMappings[] = { GA_ID,GA_ID,TAG_END };
-
- if(UpArrow = NewObject(NULL,"buttongclass",
- GA_ID, GAD_UP,
-
- GA_Image, UpImage,
- GA_RelRight, -(SizeWidth - 1),
- GA_RelBottom, -(SizeHeight - 1 + 2 * ArrowHeight),
- GA_Height, ArrowHeight,
- GA_Width, SizeWidth,
- GA_Immediate, TRUE,
- GA_RelVerify, TRUE,
- GA_Previous, Scroller,
- GA_RightBorder, TRUE,
-
- ICA_TARGET, ICTARGET_IDCMP,
- ICA_MAP, ArrowMappings,
- TAG_DONE))
- {
- if(DownArrow = NewObject(NULL,"buttongclass",
- GA_ID, GAD_DOWN,
-
- GA_Image, DownImage,
- GA_RelRight, -(SizeWidth - 1),
- GA_RelBottom, -(SizeHeight - 1 + ArrowHeight),
- GA_Height, ArrowHeight,
- GA_Width, SizeWidth,
- GA_Immediate, TRUE,
- GA_RelVerify, TRUE,
- GA_Previous, UpArrow,
- GA_RightBorder, TRUE,
-
- ICA_TARGET, ICTARGET_IDCMP,
- ICA_MAP, ArrowMappings,
- TAG_DONE))
- Result = TRUE;
- }
- }
- }
- }
- }
-
- FreeScreenDrawInfo(Screen,DrawInfo);
- }
-
- return(Result);
- }
-
- /* RefreshFastWindow(WORD FastWindowHeight):
- *
- * Refresh the contents of the fast! macro window.
- */
-
- VOID __regargs
- RefreshFastWindow(BYTE FullRefresh)
- {
- if(FastWindow)
- {
- LONG Count = (FastWindow -> Height - (FastWindow -> BorderTop + FastWindow -> BorderBottom + 1)) / (2 + UserFontHeight + 2 + 1);
-
- if(FullRefresh)
- ButtonCount = 0;
-
- if(Count == ButtonCount && Buttons)
- {
- LONG NewTop;
-
- if(!GetAttr(PGA_Top,Scroller,(ULONG *)&NewTop))
- NewTop = 0;
-
- if(NewTop != ButtonTop)
- {
- ButtonTop = NewTop;
-
- Count = 0;
-
- if(FastMacroList . lh_Head -> ln_Succ)
- {
- struct DrawInfo *DrawInfo;
-
- if(DrawInfo = GetScreenDrawInfo(FastWindow -> WScreen))
- {
- struct MacroNode *Node = (struct MacroNode *)GetListNode(ButtonTop,&FastMacroList);
- struct Gadget *Button = Buttons;
-
- while(Count < ButtonCount && Node -> mn_Succ)
- {
- SetGadgetAttrs(Button,FastWindow,NULL,
- GA_Text, Node -> mn_Macro,
- BGA_Command, Node -> mn_Code,
- TAG_DONE);
-
- Count++;
-
- Button = Button -> NextGadget;
-
- Node = Node -> mn_Succ;
- }
-
- FreeScreenDrawInfo(FastWindow -> WScreen,DrawInfo);
- }
- }
- }
- }
- else
- {
- LONG Top = FastWindow -> BorderTop + 1;
-
- if(Buttons)
- {
- struct Gadget *Next = Buttons,
- *Button;
-
- RemoveGList(FastWindow,Buttons,-1);
-
- while(Button = Next)
- {
- Next = Button -> NextGadget;
-
- DisposeObject(Button);
- }
-
- Buttons = NULL;
- }
-
- ButtonCount = Count;
-
- if(ButtonTop >= FastMacroCount)
- ButtonTop = FastMacroCount - ButtonCount;
- else
- {
- if(ButtonTop + ButtonCount > FastMacroCount)
- ButtonTop = FastMacroCount - ButtonCount;
- }
-
- if(ButtonTop < 0)
- ButtonTop = 0;
-
- Count = 0;
-
- if(FastMacroList . lh_Head -> ln_Succ)
- {
- struct DrawInfo *DrawInfo;
-
- if(DrawInfo = GetScreenDrawInfo(FastWindow -> WScreen))
- {
- struct MacroNode *Node = (struct MacroNode *)GetListNode(ButtonTop,&FastMacroList);
- LONG Width = FastWindow -> Width - (FastWindow -> BorderLeft + FastWindow -> BorderRight);
- struct Gadget *Previous = NULL,
- *Button;
-
- while(Count < ButtonCount && Node -> mn_Succ)
- {
- if(Button = NewObject(ButtonClass,NULL,
- GA_ID, Count,
-
- GA_Top, Top,
- GA_Left, FastWindow -> BorderLeft,
-
- GA_Width, Width,
- GA_Height, (2 + UserFontHeight + 2),
- GA_RelVerify, TRUE,
-
- GA_DrawInfo, DrawInfo,
- GA_Text, Node -> mn_Macro,
- BGA_Command, Node -> mn_Code,
-
- Previous ? GA_Previous : TAG_IGNORE,Previous,
- TAG_DONE))
- {
- Top += 2 + UserFontHeight + 2 + 1;
-
- Count++;
-
- Previous = Button;
-
- if(!Buttons)
- Buttons = Button;
-
- Node = Node -> mn_Succ;
- }
- }
-
- FreeScreenDrawInfo(FastWindow -> WScreen,DrawInfo);
- }
- }
-
- if(Count)
- {
- AddGList(FastWindow,Buttons,-1,-1,NULL);
-
- RefreshGList(Buttons,FastWindow,NULL,-1);
- }
-
- if(Top < FastWindow -> Height - (FastWindow -> BorderBottom + 1))
- {
- SetAPen(FastWindow -> RPort,DrawInfo -> dri_Pens[BACKGROUNDPEN]);
-
- RectFill(FastWindow -> RPort,FastWindow -> BorderLeft,Top,FastWindow -> Width - (FastWindow -> BorderRight + 1),FastWindow -> Height - (FastWindow -> BorderBottom + 1));
- }
-
- SetGadgetAttrs(Scroller,FastWindow,NULL,
- PGA_Top, ButtonTop,
- PGA_Visible, ButtonCount,
- PGA_Total, FastMacroCount,
- TAG_DONE);
- }
- }
- }
-
- /* CloseFastWindow():
- *
- * Close the fast! macro window and free the associated resources.
- */
-
- VOID
- CloseFastWindow()
- {
- CheckItem(MEN_FAST_MACROS_WINDOW,FALSE);
-
- if(Buttons)
- {
- struct Gadget *Next = Buttons,
- *Button;
-
- RemoveGList(FastWindow,Buttons,-1);
-
- while(Button = Next)
- {
- Next = Button -> NextGadget;
-
- DisposeObject(Button);
- }
-
- Buttons = NULL;
- }
-
- if(FastWindow)
- {
- PutWindowInfo(WINDOW_FAST,FastWindow -> LeftEdge,FastWindow -> TopEdge,FastWindow -> Width,FastWindow -> Height);
-
- ClearMenuStrip(FastWindow);
- CloseWindowSafely(FastWindow);
-
- FastWindow = NULL;
- }
-
- FreeButtonClass();
- }
-
- /* OpenFastWindow():
- *
- * Open the fast! macro window.
- */
-
- BYTE
- OpenFastWindow()
- {
- if(FastWindow)
- return(TRUE);
-
- if(NewButtonClass())
- {
- if(FastCreateScroller(Window -> WScreen))
- {
- LONG Left = 0,
- Top = 0,
- Width = Window -> WScreen -> WBorLeft + 2 + SZ_GetLen("####################") + 2 + RightBorderWidth,
- Height = 0;
-
- GetWindowInfo(WINDOW_FAST,&Left,&Top,&Width,&Height,NULL,Window -> WScreen -> WBorTop + Window -> WScreen -> Font -> ta_YSize + 1 + 1 + 10 * (2 + UserFontHeight + 2 + 1) + Window -> WScreen -> WBorBottom);
-
- if(WindowZoomBox . Left == -1)
- {
- WindowZoomBox . Left = 0;
- WindowZoomBox . Top = 0;
- WindowZoomBox . Width = Width;
- WindowZoomBox . Height = Window -> WScreen -> WBorTop + Window -> WScreen -> Font -> ta_YSize + 1;
- }
-
- if(FastWindow = OpenWindowTags(NULL,
- WA_Width, Width,
- WA_Height, Height,
-
- WA_Left, Left,
- WA_Top, Top,
-
- WA_DragBar, TRUE,
- WA_DepthGadget, TRUE,
- WA_CloseGadget, TRUE,
- WA_RMBTrap, TRUE,
- WA_Zoom, &WindowZoomBox,
- // WA_NoCareRefresh, TRUE,
- BackfillTag, &BackfillHook,
- WA_MenuHelp, TRUE,
- WA_SimpleRefresh, TRUE,
-
- WA_SizeGadget, TRUE,
-
- WA_MinWidth, Width,
- WA_MaxWidth, Width,
-
- WA_MinHeight, Window -> WScreen -> WBorTop + Window -> WScreen -> Font -> ta_YSize + 1 + 2 * (2 + UserFontHeight + 2 + 1) + 1 + Window -> WScreen -> WBorBottom,
- WA_MaxHeight, Window -> WScreen -> Height,
-
- WA_Title, LocaleString(MSG_FASTMACROS_FAST_MACROS_TXT),
-
- WA_NewLookMenus, TRUE,
- WA_Gadgets, Scroller,
-
- WA_CustomScreen, Window -> WScreen,
-
- AmigaGlyph ? WA_AmigaKey : TAG_IGNORE, AmigaGlyph,
- CheckGlyph ? WA_Checkmark : TAG_IGNORE, CheckGlyph,
- TAG_DONE))
- {
- ButtonTop = 0;
- ButtonCount = -1;
-
- FastWindow -> UserPort = Window -> UserPort;
-
- if(ModifyIDCMP(FastWindow,DEFAULT_IDCMP | IDCMP_IDCMPUPDATE | IDCMP_SIZEVERIFY | IDCMP_REFRESHWINDOW))
- {
- SetMenuStrip(FastWindow,Menu);
-
- FastWindow -> Flags &= ~WFLG_RMBTRAP;
-
- RefreshFastWindow(TRUE);
-
- CheckItem(MEN_FAST_MACROS_WINDOW,TRUE);
-
- return(TRUE);
- }
- else
- {
- FastWindow -> UserPort = NULL;
-
- CloseWindow(FastWindow);
-
- FastWindow = NULL;
- }
- }
-
- FastDeleteScroller();
- }
-
- FreeButtonClass();
- }
-
- return(FALSE);
- }
-
- /* HandleFastWindowGadget(ULONG IClass,LONG ICode,LONG GadgetID):
- *
- * Process fast! macro window input.
- */
-
- VOID __regargs
- HandleFastWindowGadget(ULONG IClass,LONG ICode,LONG GadgetID)
- {
- STATIC BYTE Scrolling = FALSE;
-
- switch(IClass)
- {
- case IDCMP_GADGETUP:
-
- if(GadgetID == GAD_SCROLLER)
- Scrolling = FALSE;
- else
- {
- if(GadgetID < GAD_SCROLLER && !ICode)
- {
- struct MacroNode *Node;
-
- if(Node = (struct MacroNode *)GetListNode(GadgetID + ButtonTop,&FastMacroList))
- {
- if(Node -> mn_Code[0])
- SerialCommand(Node -> mn_Code);
- }
- }
- }
-
- break;
-
- case IDCMP_GADGETDOWN:
-
- if(GadgetID == GAD_SCROLLER)
- {
- Scrolling = TRUE;
-
- RefreshFastWindow(FALSE);
- }
-
- break;
-
- case IDCMP_MOUSEMOVE:
-
- if(Scrolling)
- RefreshFastWindow(FALSE);
-
- break;
-
- case IDCMP_IDCMPUPDATE:
-
- switch(GadgetID)
- {
- case GAD_UP: if(ButtonTop)
- {
- SetGadgetAttrs(Scroller,FastWindow,NULL,
- PGA_Top,ButtonTop - 1,
- TAG_DONE);
-
- RefreshFastWindow(FALSE);
- }
-
- break;
-
- case GAD_DOWN: if(ButtonTop + ButtonCount < FastMacroCount)
- {
- SetGadgetAttrs(Scroller,FastWindow,NULL,
- PGA_Top,ButtonTop + 1,
- TAG_DONE);
-
- RefreshFastWindow(FALSE);
- }
-
- break;
- }
-
- break;
- }
- }
-